/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package heartinjava;

import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;


/**
 *
 * @author TIENDAT
 */
public class Player {
    
    protected String                nameNC;
    private List<Integer>           dsBai; // danh sach bai    
    protected ArrayList<Integer>    arrayCardWin; // chua cac quan bai an dc
    private ArrayList<Integer>      arrayDoiBai; // chua 3 quan bai de exchange
    protected int                   scoreNC;

    public Player() 
    {
        Init();
    }

    public Player(String argName) 
    {
        Init();
        nameNC = argName;
    }

    private void Init()
    {
        nameNC = "";
        scoreNC = 0;
        dsBai = new ArrayList<Integer>();
        arrayCardWin = new ArrayList<Integer>();
        arrayDoiBai = new ArrayList<Integer>();
    }
    
    public void setName(String name) 
    {
        this.nameNC = name;
    }

    public String getName() 
    {
        return nameNC;
    }

    public void setScore(int score) 
    {
        this.scoreNC = score;
    }

    public int getScore() 
    {
        return scoreNC;
    }

    public void congDiem(int scorenc) 
    {
        this.scoreNC += scorenc;
    }

    public void nhanThemLaBai(int id)
    {
        if(id>0 && id<53)
        {
            getListCard().add(id);
        }
    }
    
    //--------------------------------
    //-- lấy chỉ số quân bài
    //--------------------------------
    public int layChiSoLaBai(int index) 
    {
        if (index < dsBai.size()){
            return dsBai.get(index);       
        }
        return -1;
    }

    //-----------------------------------------------
    //-- hàm đánh ra 1 quân bài
    //-- nếu ok trả ra chỉ số lá bài đó, ko thì ra -1
    //-- và remove lá bài đó ra khỏi danh sách bài
    //-----------------------------------------------
    public int danhRaMotLaBai(int chiSoLaBai) 
    {
        if (!dsBai.isEmpty()){
            for (int index=0; index<dsBai.size();index++)
            {
                if (layChiSoLaBai(index)==chiSoLaBai)
                {
                    dsBai.remove(index);
                    return chiSoLaBai;
                }
            }
        }
        return -1;
    }

    //-----------------------------
    //-- sortBoBai bộ bài theo nước
    //-----------------------------
    public void sortBoBai()
    {
        Collections.sort(dsBai,new CardComparator());
    }
    
    //----------------------------------------------------
    //-- tính điểm cho từng người chơi wa 4 lá bài đánh ra
    //-- cơ + 1
    //-- đầm chuồng + 13
    //----------------------------------------------------
    public void congDiem4LabaiDanh(ArrayList<Integer> arr4LaBai) 
    {
        for (int i = 0; i <= 3; i++) 
        {
            arrayCardWin.add(arr4LaBai.get(i));
            if (LaBai.getnuoc_labai(arr4LaBai.get(i)) == KhaiBao.NUOCHEARTS) 
            {
                congDiem(1);
            }
            if (arr4LaBai.get(i) == KhaiBao.ISSPEADS) 
            {
                congDiem(13);
            }
        }
        arr4LaBai.clear();
    }

    public void newRound() 
    {
        getListCard().clear();
        arrayCardWin.clear();
    }
    
    public void resetDiem() 
    {
        scoreNC = 0;
    }

    public boolean checkShootTheMoon() 
    {
        int demCo = 0;
        for (int i = 0; i < arrayCardWin.size(); i++) 
        {
            if (LaBai.getnuoc_labai(arrayCardWin.get(i)) == KhaiBao.NUOCHEARTS) {
                demCo++;
            }
        }
        if (demCo == 13) 
        {
            for (int i = 0; i < arrayCardWin.size(); i++) 
            {
                if (arrayCardWin.get(i) == KhaiBao.ISSPEADS) {
                    congDiem(-26);
                    return true;
                }
            }
            return false;
        } else {
            return false;
        }
    }

    //------------------------------------
    //-- xử đi 2 chuồng
    //------------------------------------
    public int di2Chuong() 
    {
        for (int i = 0; i < dsBai.size(); i++) 
        {
            if (getListCard().get(i) == KhaiBao.ISTWOCLUBS) 
            {
                int id = getListCard().get(i);;
                danhRaMotLaBai(KhaiBao.ISTWOCLUBS);
                return id;
            }
        }
        return -1;
    }

    public ArrayList<Integer> getThreeCard() 
    {
        return arrayDoiBai;
    }
    
    //-------------------------------------------------
    //-- lấy ra 3 thằng để đổi bài
    //-------------------------------------------------
    public ComputerPlayer.ThreeCard  playThreeCard()
    {
        ComputerPlayer.ThreeCard _3card2 = null;
        if (!arrayDoiBai.isEmpty())
        {
            _3card2 = new ComputerPlayer.ThreeCard(
                    this.danhRaMotLaBai(arrayDoiBai.get(0)),
                    this.danhRaMotLaBai(arrayDoiBai.get(1)),
                    this.danhRaMotLaBai(arrayDoiBai.get(2)));
        }
        return _3card2;
    }

    public void setThreeCard(ArrayList<Integer> threeCard) 
    {
        this.arrayDoiBai = threeCard;
    }

    public ArrayList<Integer> getListCard() 
    {
        return (ArrayList<Integer>) dsBai;
    }

    public void setHandcard(ArrayList<Integer> handcard) 
    {
        this.dsBai = handcard;
    }

    //--------------------------------------
    //-- kiểm tra xem còn con nào cùng nước
    //-- với con đang đánh ko (dựa vào chỉ số)
    //--------------------------------------
    boolean kiemTraCungNuocChiSo(int chiSo) 
    {
        if (!dsBai.isEmpty())
        {
            for (int index=0; index<dsBai.size();index++)
            {
                if(LaBai.getnuoc_labai(dsBai.get(index))== LaBai.getnuoc_labai(chiSo)){
                    return true;
                }
            }
        }
        return false;
    }

    boolean isContainCard(int chiSo) 
    {
        for (int i=0; i< getListCard().size(); i++)
        {
            if (layChiSoLaBai(i)==chiSo){
                return true;
            }
        }
        return false ;
    }
    
    //--------------------------------
    //-- kiem tra quân bài có toàn bộ
    //-- là CO hoặc BICH
    //--------------------------------
    public boolean kiemTraCoAndBich()
    {
        for (int i = 0; i < dsBai.size(); ++i)
            if (dsBai.get(i) != KhaiBao.ISSPEADS && LaBai.getnuoc_labai(dsBai.get(i)) != KhaiBao.NUOCHEARTS)
                return false;    
        return true;
    }

    public int danhMotLaBaiNgauNhien() 
    {
        SecureRandom numGenerate = new SecureRandom();
        int random = 0;
        while (random == 0) 
        {
            if (!dsBai.isEmpty()) 
            {
                if (dsBai.size() == 1) 
                {
                    random = 0;
                } 
                else 
                {
                    random = numGenerate.nextInt(dsBai.isEmpty() ? 0 : dsBai.size() - 1);
                }
            }
        }
        return danhRaMotLaBai(dsBai.get(random));
    }
    
    //-------------------------------------
    //-- người dc đi nước dau tien
    //-------------------------------------
    public int playfirst(boolean duocChonCo) 
    {
        SecureRandom numGenerate = new SecureRandom();
        int random = 0;

        if (kiemTraCoAndBich())
        {
            return  (getListCard().size() == 1 ? danhRaMotLaBai(getListCard().get(0)) : danhRaMotLaBai(getListCard().get(numGenerate.nextInt(getListCard().size() - 1))));
        }
        
        while (((getListCard().get(random) == KhaiBao.ISSPEADS)  || LaBai.getnuoc_labai(getListCard().get(random)) == KhaiBao.NUOCHEARTS)&& (!duocChonCo)) 
        {
            if (getListCard().size() == 1)
            {
                random = 0;
                duocChonCo = true;
            }
            else
            {
                random = numGenerate.nextInt(getListCard().size() - 1);
            }
            System.out.println("Random: " + random + "; Listcard at random:" + getListCard().get(random));
        }
        return danhRaMotLaBai(getListCard().get(random));
    }
    
    
    
    public int playfollow(int id) 
    {
        ArrayList<Integer> samerank = new ArrayList<Integer>();
        for (int i = 0; i < getListCard().size(); ++i)
        {
            if (LaBai.cungNuocCo(id, getListCard().get(i)))
            {
                samerank.add(getListCard().get(i));
            }
        }
        if (!samerank.isEmpty()) 
        {
            SecureRandom numGenerate = new SecureRandom();
            int random = 0;
            int size = samerank.size();
            if (size == 1) 
            {
                random = 0;
            } else {
                random = numGenerate.nextInt(samerank.size() - 1);
            }
            return danhRaMotLaBai(samerank.get(random));
        } else {
            return playfirst(true);
        }
    }
}

class CardComparator implements Comparator<Integer> 
{
    public int compare(Integer chiso1, Integer chiso2) 
    {
        int type1 = chiso1%4;
        int rank1 = chiso1/4 + 1;
        int type2 = chiso2%4;
        int rank2 = chiso2/4 + 1;

        if (type1 > type2) 
        {
            return -1;
        }
        else if (type1 < type2) 
        {
            return 1;
        }
        else 
        {
            if (rank1 > rank2) 
            {
                return -1;
            }
            else if (rank1 < rank2) 
            {
                return 1;
            }
            else 
            {
                return 0;
            }
        }
    }
}